#ifndef EXAMPLE_H
#define EXAMPLE_H

#include <string>

#define CONFIG_EXAMPLE(ExampleClassName)\
ExampleClassName::ExampleClassName() : Example(#ExampleClassName)
#define LOG_V_ERROR__(value)\
std::cerr << "\033[31m" << value << "\033[0m"
#define LOG_V_SUCCESS(value)\
std::cerr << "\033[32m" << value << "\033[0m"
#define LOG_V_WARNING(value)\
std::cerr << "\033[33m" << value << "\033[0m"
#define LOG_V_INFO___(value)\
std::cerr << "\033[34m" << value << "\033[0m"
#define LOG_V_SHELL__(value)\
std::cerr << "\033[35m" << value << "\033[0m"
#define LOG_V_DEBUG__(value)\
std::cerr << "\033[36m" << value << "\033[0m"
#define LOG_V_TRACE__(value)\
std::cerr << "\033[0m" << value << "\033[0m"
#define LOG_ERROR__(message)\
std::cerr << "\033[31m" << #message << "\033[0m"
#define LOG_SUCCESS(message)\
std::cerr << "\033[32m" << #message << "\033[0m"
#define LOG_WARNING(message)\
std::cerr << "\033[33m" << #message << "\033[0m"
#define LOG_INFO___(message)\
std::cerr << "\033[34m" << #message << "\033[0m"
#define LOG_SHELL__(message)\
std::cerr << "\033[35m" << #message << "\033[0m"
#define LOG_DEBUG__(message)\
std::cerr << "\033[36m" << #message << "\033[0m"
#define LOG_TRACE__(message)\
std::cerr << "\033[0m" << #message << "\033[0m"

class Example
{
protected:
	std::string name;
public:
	Example(const std::string& name = "Example") :name(name) {};
	virtual ~Example() = default;
	virtual void setUp() {};
	virtual void tearDown() {};
	virtual void execute() {};
	std::string getName() const;
};

#endif // !EXAMPLE_H
